/**
* Licensed to JumpMind Inc under one or more contributor
* license agreements. See the NOTICE file distributed
* with this work for additional information regarding
* copyright ownership. JumpMind Inc licenses this file
* to you under the GNU General Public License, version 3.0 (GPLv3)
* (the "License"); you may not use this file except in compliance
* with the License.
*
* You should have received a copy of the GNU General Public License,
* version 3.0 (GPLv3) along with this library; if not, see
* <http://www.gnu.org/licenses/>.
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jumpmind.symmetric.io;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;
import org.jumpmind.symmetric.SymmetricException;
import org.jumpmind.symmetric.service.IParameterService;
import com.mongodb.DB;
import com.mongodb.MongoClient;
import com.mongodb.WriteConcern;
public class SimpleMongoClientManager implements IMongoClientManager {
protected IParameterService parameterService;
protected String name = "mongodb";
/*
* This is static because the MongoClient is thread safe and wraps a pool of
* connections
*/
protected static Map<String, MongoClient> clients = new HashMap<String, MongoClient>();
protected DB currentDB;
public SimpleMongoClientManager(IParameterService parameterService, String name) {
this.name = name;
this.parameterService = parameterService;
}
@Override
public MongoClient get() {
MongoClient client = clients.get(name);
if (client == null) {
synchronized (clients) {
if (client == null) {
int port = 27017;
String host = "localhost";
if (parameterService != null) {
port = parameterService.getInt(name + MongoConstants.PORT, port);
host = parameterService.getString(name + MongoConstants.HOST, host);
}
try {
client = new MongoClient(host, port);
clients.put(name, client);
} catch (UnknownHostException e) {
throw new SymmetricException(e);
}
}
}
}
return client;
}
@Override
public DB getDB(String name) {
if (currentDB == null || !currentDB.getName().equals(name)) {
currentDB = get().getDB(name);
/**
* TODO make this a property
*/
currentDB.setWriteConcern(WriteConcern.ACKNOWLEDGED);
String username = null;
char[] password = null;
if (parameterService != null) {
username = parameterService.getString(name + MongoConstants.USERNAME, username);
String passwordString = parameterService.getString(name + MongoConstants.PASSWORD,
null);
if (passwordString != null) {
password = passwordString.toCharArray();
}
}
if (username != null && !currentDB.authenticate(username, password)) {
throw new SymmetricException("Failed to authenticate with the mongo database: "
+ name);
}
}
return currentDB;
}
@Override
public String getName() {
return name;
}
}